/*
 * protection.h
 *
 *  Created on: 20.07.2013
 *      Author: SpirTanol
 */

#ifndef PROTECTION_H_
#define PROTECTION_H_

#include "device/common.h"

class ConfigPacket;

/** Эмулирует защиту УЗД, используется для построения графика характеристики защит */
class Protection
{
	struct USTAVK
	{
		u16 nom_current; //!< 2 номинальный ток двигателя
		u16 min_current; //!< 3 минимальный допустимый ток двигателя
		u16 max_current; //!< 4 порог среднебыстродействующей защиты в разах
		u16 otkl_t2    ; //!< 6 время отключения при двухкратной перегрузке
		u8  fast_prt_on; //!< 28 разрешение быстродействующей защиты
		u16 max_c_time ; //!< 29 время реакции среднебыстродействующей защиты
		u16  obr       ; //!< 30 допустимое количество оборванных фаз
	};

	volatile u16 prg_fast_h;//!< верхний порог для быстродействующей защиты
	char run;
	float Tm;//!< тепловая постоянная двигателя
	float Qm;//нормированная тепловая энергия двигателя
	u8 counter;
	volatile char tripping;
	u16 overld_time;
	u8  overld[3];
	u8  counter_u[3];    //отсчет до отключения
	u16 currents[3];

	USTAVK ust;

	void avar_off(void);
	void protect_one_phase_I(s16 cr_norm);
	void protect_one_phase_R(u8 ch, u16 cr_norm);
	void protect_one_phase_U(u8 ch, u16 cr_norm_x10);
	void protect_one_phase_L(u16 cr_norm_x10);
	void check_run(u8 ch, u16 cr_norm_x10);
	void protect_one_phase(u8 ch, u16 cr_norm_x10);
	void init_protection(void);

public:
	Protection();
	~Protection();

	void setConfig(const ConfigPacket *config);
	void copyConfig(const Protection *protection);

	inline u16 curNom() const { return ust.nom_current; }

	u32 get_trip_time(u32 norm_current);
};

#endif /* PROTECTION_H_ */
